library(tidyverse)
library(here)
library(cowplot)
here("README.md")
[1] "/Users/emma/Library/CloudStorage/OneDrive-SharedLibraries-IndianaUniversity/Lennon, Jay - 0000_Bueren/Projects/LifeStyle/PhageLifestyleSporulation/README.md"
dr_here()
here() starts at /Users/emma/Library/CloudStorage/OneDrive-SharedLibraries-IndianaUniversity/Lennon, Jay - 0000_Bueren/Projects/LifeStyle/PhageLifestyleSporulation.
- This directory contains a file matching "[.]Rproj$" with contents matching "^Version: " in the first line
- Initial working directory: /Users/emma/Library/CloudStorage/OneDrive-SharedLibraries-IndianaUniversity/Lennon, Jay - 0000_Bueren/Projects/LifeStyle/PhageLifestyleSporulation
- Current working directory: /Users/emma/Library/CloudStorage/OneDrive-SharedLibraries-IndianaUniversity/Lennon, Jay - 0000_Bueren/Projects/LifeStyle/PhageLifestyleSporulation
pal2 <- c("#015b58", "#5962b5")
pal2.flip <- c("#5962b5", "#015b58")
inph <- read.csv("data/inphared_db/14Apr2025_knownsporestatus.csv", row.names=1)
inph$sporulation <- "T"
inph$sporulation <- ifelse(inph$f_spor==TRUE, "SproulatingHost", "NonsporulatingHost")

inph <- unite(inph, "phage_type", c("sporulation", "predicted_label"), sep = "_", remove = FALSE, na.rm = FALSE)

compare genome size of temperate vs. lytic

inph.all <- inph
#inph<- subset(inph.all, inph.all$Jumbophage==FALSE)


ggplot(inph.all, aes(x = factor(f_spor), fill = factor(predicted_label), y = Genome.Length..bp.)) + 
  geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2)  + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("Phage Genome Size (bp)") + xlab("") + ggtitle("INPHARED, with jumbophages") + labs(fill="Lifestyle")
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`

# ggplot(inph, aes(x = factor(f_spor), fill = factor(predicted_label), y = Genome.Length..bp.)) 
#  geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("Phage # Genome Size (bp)") + xlab("") + ggtitle("INPHARED, no jumbophages") + labs(fill="Lifestyle")
  
  
  
  
  
inph.spor <- subset(inph.all, inph.all$f_spor==TRUE)  

size.spor <- ggplot(inph.spor, aes(x = factor(predicted_label), fill = factor(predicted_label), y = Genome.Length..bp.)) + 
  geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2)  + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("Phage Genome Size (bp)") + xlab("") + ggtitle("") + labs(fill="Lifestyle")+ ylim(0, 1000000)
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
inph.no <- subset(inph.all, inph.all$f_spor==FALSE)  

size.no <- ggplot(inph.no, aes(x = factor(predicted_label), fill = factor(predicted_label), y = Genome.Length..bp.)) + 
  geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2)  + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("Phage Genome Size (bp)") + xlab("") + ggtitle("") + labs(fill="Lifestyle") + ylim(0, 1000000) + theme(legend.position = "none")
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
genome.size <- plot_grid(size.no, size.spor, labels = c('Nonsporulating Host', 'Sporulating Host'), label_size = 12, rel_widths = c(1.5, 2))

genome.size


inph.all$f_spor <- as.factor(inph.all$f_spor)
inph.all$predicted_label <- as.factor(inph.all$predicted_label)
inph.all$Host <- as.factor(inph.all$Host)

#inph <- subset(inph, inph$Jumbophage==FALSE)

oneway <- aov(Genome.Length..bp. ~ predicted_label, data = inph.all)

summary(oneway)
                  Df    Sum Sq   Mean Sq F value Pr(>F)    
predicted_label    1 1.270e+12 1.270e+12     669 <2e-16 ***
Residuals       3341 6.341e+12 1.898e+09                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
twoway <- aov(Genome.Length..bp. ~ predicted_label + f_spor, data = inph.all)

summary(twoway)
                  Df    Sum Sq   Mean Sq F value Pr(>F)    
predicted_label    1 1.270e+12 1.270e+12   695.9 <2e-16 ***
f_spor             1 2.472e+11 2.472e+11   135.5 <2e-16 ***
Residuals       3340 6.094e+12 1.825e+09                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
twoway.int <- aov(Genome.Length..bp. ~ predicted_label * f_spor, data = inph.all)

summary(twoway.int)
                         Df    Sum Sq   Mean Sq F value   Pr(>F)    
predicted_label           1 1.270e+12 1.270e+12   705.9  < 2e-16 ***
f_spor                    1 2.472e+11 2.472e+11   137.4  < 2e-16 ***
predicted_label:f_spor    1 8.795e+10 8.795e+10    48.9 3.25e-12 ***
Residuals              3339 6.006e+12 1.799e+09                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
block <- aov(Genome.Length..bp. ~predicted_label + f_spor + Host, data = inph.all)

summary(block)
                  Df    Sum Sq   Mean Sq F value Pr(>F)    
predicted_label    1 1.270e+12 1.270e+12  925.30 <2e-16 ***
f_spor             1 2.472e+11 2.472e+11  180.11 <2e-16 ***
Host              55 1.586e+12 2.884e+10   21.02 <2e-16 ***
Residuals       3285 4.508e+12 1.372e+09                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
block_int <- aov(Genome.Length..bp. ~ predicted_label + f_spor * Host, data = inph.all)
summary(block_int)
                  Df    Sum Sq   Mean Sq F value Pr(>F)    
predicted_label    1 1.270e+12 1.270e+12  925.30 <2e-16 ***
f_spor             1 2.472e+11 2.472e+11  180.11 <2e-16 ***
Host              55 1.586e+12 2.884e+10   21.02 <2e-16 ***
Residuals       3285 4.508e+12 1.372e+09                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
all_int <- aov(Genome.Length..bp. ~ predicted_label * f_spor * Host, data = inph.all)
summary(all_int)
                         Df    Sum Sq   Mean Sq  F value Pr(>F)    
predicted_label           1 1.270e+12 1.270e+12 1056.407 <2e-16 ***
f_spor                    1 2.472e+11 2.472e+11  205.635 <2e-16 ***
Host                     55 1.586e+12 2.884e+10   23.992 <2e-16 ***
predicted_label:f_spor    1 3.460e+09 3.460e+09    2.879 0.0898 .  
predicted_label:Host     19 5.800e+11 3.053e+10   25.399 <2e-16 ***
Residuals              3265 3.924e+12 1.202e+09                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
library(AICcmodavg)

model.set <- list(oneway, twoway, twoway.int, block, block_int)
model.names <- c("one.way", "two.way", "interaction", "blocking", "block_int")

aictab(model.set, modnames = model.names)
Warning: 
Check model structure carefully as some models may be redundant

Model selection based on AICc:

             K     AICc Delta_AICc AICcWt Cum.Wt        LL
blocking    59 79884.43       0.00    0.5    0.5 -39882.14
block_int   59 79884.43       0.00    0.5    1.0 -39882.14
interaction  5 80733.51     849.08    0.0    1.0 -40361.74
two.way      4 80780.10     895.67    0.0    1.0 -40386.04
one.way      3 80911.01    1026.58    0.0    1.0 -40452.50
par(mfrow=c(2,2))
plot(twoway.int)
par(mfrow=c(1,1))


terms(block)
Genome.Length..bp. ~ predicted_label + f_spor + Host
attr(,"variables")
list(Genome.Length..bp., predicted_label, f_spor, Host)
attr(,"factors")
                   predicted_label f_spor Host
Genome.Length..bp.               0      0    0
predicted_label                  1      0    0
f_spor                           0      1    0
Host                             0      0    1
attr(,"term.labels")
[1] "predicted_label" "f_spor"          "Host"           
attr(,"order")
[1] 1 1 1
attr(,"intercept")
[1] 1
attr(,"response")
[1] 1
attr(,".Environment")
<environment: R_GlobalEnv>
attr(,"predvars")
list(Genome.Length..bp., predicted_label, f_spor, Host)
attr(,"dataClasses")
Genome.Length..bp.    predicted_label             f_spor               Host 
         "numeric"           "factor"           "factor"           "factor" 
TukeyHSD(block)  # or:
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Genome.Length..bp. ~ predicted_label + f_spor + Host, data = inph.all)

$predicted_label
                       diff     lwr      upr p adj
virulent-temperate 39312.13 36778.2 41846.05     0

$f_spor
               diff      lwr      upr p adj
TRUE-FALSE 20058.93 17128.38 22989.48     0

$Host
                                                    diff           lwr         upr     p adj
Acutalibacter-Acetoanaerobium                23239.65278 -189290.98121 235770.2868 1.0000000
Aeribacillus-Acetoanaerobium                 15545.00000 -196985.63400 228075.6340 1.0000000
Aerococcus-Acetoanaerobium                   78596.64853 -133933.98546 291127.2825 1.0000000
Agathobaculum-Acetoanaerobium               -30482.00425 -214538.93238 153574.9239 1.0000000
Alicyclobacillus-Acetoanaerobium             44861.99575 -167668.63825 257392.6297 1.0000000
Amedibacillus-Acetoanaerobium               -23787.00000 -207843.92813 160269.9281 1.0000000
Anaerostipes-Acetoanaerobium                   403.00000 -173127.53600 173933.5360 1.0000000
Anoxybacillus-Acetoanaerobium                 4786.00000 -207744.63400 217316.6340 1.0000000
Bacillus-Acetoanaerobium                     40954.55007 -109488.80905 191397.9092 1.0000000
Blautia-Acetoanaerobium                      10005.00000 -202525.63400 222535.6340 1.0000000
Brevibacillus-Acetoanaerobium                24156.99884 -132807.27687 181121.2745 1.0000000
Brochothrix-Acetoanaerobium                  39461.15119 -119936.82431 198859.1267 1.0000000
Butyrivibrio-Acetoanaerobium                -22850.50212 -185173.45509 139472.4508 1.0000000
Caldibacillus-Acetoanaerobium                 1255.00000 -211275.63400 213785.6340 1.0000000
Carnobacterium-Acetoanaerobium                1754.98187 -171775.55413 175285.5179 1.0000000
Clostridioides-Acetoanaerobium               34463.30000 -119529.77437 188456.3744 1.0000000
Clostridium-Acetoanaerobium                 -11841.15277 -162691.18066 139008.8751 1.0000000
Cytobacillus-Acetoanaerobium                -52949.00425 -265479.63825 159581.6297 1.0000000
Dorea-Acetoanaerobium                         2259.00000 -210271.63400 214789.6340 1.0000000
Enterocloster-Acetoanaerobium                65725.83333  -96597.11963 228048.7863 0.9999992
Enterococcus-Acetoanaerobium                 20756.67217 -129767.37526 171280.7196 1.0000000
Erysipelothrix-Acetoanaerobium               26437.50000 -157619.42813 210494.4281 1.0000000
Faecalibacterium-Acetoanaerobium              3530.33227 -152887.97908 159948.6436 1.0000000
Flavonifractor-Acetoanaerobium               -3910.35005 -177440.88605 169620.1860 1.0000000
Geobacillus-Acetoanaerobium                   5710.53248 -149499.89739 160920.9624 1.0000000
Hungatella-Acetoanaerobium                  -59354.00425 -271884.63825 153176.6297 1.0000000
Kurthia-Acetoanaerobium                     -20206.00000 -232736.63400 192324.6340 1.0000000
Lacticaseibacillus-Acetoanaerobium           15691.90278 -138301.17159 169684.9772 1.0000000
Lactiplantibacillus-Acetoanaerobium          24167.15066 -159889.77747 208224.0788 1.0000000
Lactobacillus-Acetoanaerobium                28431.63125 -122607.31347 179470.5760 1.0000000
Lactococcus-Acetoanaerobium                 -13311.33588 -163778.15074 137155.4790 1.0000000
Latilactobacillus-Acetoanaerobium            21916.58136 -133639.91456 177473.0773 1.0000000
Leuconostoc-Acetoanaerobium                 -19077.30891 -172458.08235 134303.4645 1.0000000
Levilactobacillus-Acetoanaerobium            83466.64853 -129063.98546 295997.2825 0.9999997
Liquorilactobacillus-Acetoanaerobium        -27294.35147 -239824.98546 185236.2825 1.0000000
Listeria-Acetoanaerobium                     42312.33319 -108690.29973 193314.9661 1.0000000
Lysinibacillus-Acetoanaerobium               44205.79745 -120419.72376 208831.3187 1.0000000
Mammaliicoccus-Acetoanaerobium               89183.64853  -84346.88747 262714.1845 0.9991623
Moorella-Acetoanaerobium                     42648.99788 -141407.93025 226705.9260 1.0000000
Oenococcus-Acetoanaerobium                    9655.93728 -151002.12087 170313.9954 1.0000000
Paenibacillus-Acetoanaerobium                 3791.74965 -147270.79307 154854.2924 1.0000000
Parageobacillus-Acetoanaerobium              11176.50000 -172880.42813 195233.4281 1.0000000
Pediococcus-Acetoanaerobium                 -17196.35147 -229726.98546 195334.2825 1.0000000
Peptoclostridium-Acetoanaerobium             95265.00000 -117265.63400 307795.6340 0.9999801
Psychrobacillus-Acetoanaerobium              39429.00000 -134101.53600 212959.5360 1.0000000
Roseburia-Acetoanaerobium                     9249.00000 -174807.92813 193305.9281 1.0000000
Ruminococcus-Acetoanaerobium                  1041.00000 -161281.95297 163363.9530 1.0000000
Sporosarcina-Acetoanaerobium                -10752.00425 -223282.63825 201778.6297 1.0000000
Staphylococcus-Acetoanaerobium               49046.61951 -101337.01551 199430.2545 1.0000000
Streptococcus-Acetoanaerobium                20453.54831 -129924.97958 170832.0762 1.0000000
Terrisporobacter-Acetoanaerobium              6451.50000 -161568.71900 174471.7190 1.0000000
Tetragenococcus-Acetoanaerobium               1481.15278 -182575.77534 185538.0809 1.0000000
Thermoanaerobacterium-Acetoanaerobium         5877.00000 -206653.63400 218407.6340 1.0000000
Virgibacillus-Acetoanaerobium                11955.00000 -200575.63400 224485.6340 1.0000000
Weissella-Acetoanaerobium                     4116.50871 -156541.54944 164774.5669 1.0000000
Weizmannia-Acetoanaerobium                  -22366.00425 -234896.63825 190164.6297 1.0000000
Aeribacillus-Acutalibacter                   -7694.65278 -220225.28678 204835.9812 1.0000000
Aerococcus-Acutalibacter                     55356.99575 -157173.63825 267887.6297 1.0000000
Agathobaculum-Acutalibacter                 -53721.65703 -237778.58516 130335.2711 1.0000000
Alicyclobacillus-Acutalibacter               21622.34297 -190908.29103 234152.9770 1.0000000
Amedibacillus-Acutalibacter                 -47026.65278 -231083.58091 137030.2753 1.0000000
Anaerostipes-Acutalibacter                  -22836.65278 -196367.18879 150693.8832 1.0000000
Anoxybacillus-Acutalibacter                 -18453.65278 -230984.28678 194076.9812 1.0000000
Bacillus-Acutalibacter                       17714.89728 -132728.46183 168158.2564 1.0000000
Blautia-Acutalibacter                       -13234.65278 -225765.28678 199295.9812 1.0000000
Brevibacillus-Acutalibacter                    917.34606 -156046.92965 157881.6218 1.0000000
Brochothrix-Acutalibacter                    16221.49841 -143176.47709 175619.4739 1.0000000
Butyrivibrio-Acutalibacter                  -46090.15491 -208413.10787 116232.7981 1.0000000
Caldibacillus-Acutalibacter                 -21984.65278 -234515.28678 190545.9812 1.0000000
Carnobacterium-Acutalibacter                -21484.67092 -195015.20692 152045.8651 1.0000000
Clostridioides-Acutalibacter                 11223.64722 -142769.42715 165216.7216 1.0000000
Clostridium-Acutalibacter                   -35080.80555 -185930.83345 115769.2223 1.0000000
Cytobacillus-Acutalibacter                  -76188.65703 -288719.29103 136341.9770 1.0000000
Dorea-Acutalibacter                         -20980.65278 -233511.28678 191549.9812 1.0000000
Enterocloster-Acutalibacter                  42486.18055 -119836.77242 204809.1335 1.0000000
Enterococcus-Acutalibacter                   -2482.98061 -153007.02805 148041.0668 1.0000000
Erysipelothrix-Acutalibacter                  3197.84722 -180859.08091 187254.7753 1.0000000
Faecalibacterium-Acutalibacter              -19709.32051 -176127.63187 136708.9908 1.0000000
Flavonifractor-Acutalibacter                -27150.00283 -200680.53884 146380.5332 1.0000000
Geobacillus-Acutalibacter                   -17529.12030 -172739.55017 137681.3096 1.0000000
Hungatella-Acutalibacter                    -82593.65703 -295124.29103 129936.9770 0.9999998
Kurthia-Acutalibacter                       -43445.65278 -255976.28678 169084.9812 1.0000000
Lacticaseibacillus-Acutalibacter             -7547.75000 -161540.82437 146445.3244 1.0000000
Lactiplantibacillus-Acutalibacter              927.49788 -183129.43025 184984.4260 1.0000000
Lactobacillus-Acutalibacter                   5191.97847 -145846.96625 156230.9232 1.0000000
Lactococcus-Acutalibacter                   -36550.98867 -187017.80353 113915.8262 1.0000000
Latilactobacillus-Acutalibacter              -1323.07143 -156879.56735 154233.4245 1.0000000
Leuconostoc-Acutalibacter                   -42316.96170 -195697.73514 111063.8117 1.0000000
Levilactobacillus-Acutalibacter              60226.99575 -152303.63825 272757.6297 1.0000000
Liquorilactobacillus-Acutalibacter          -50534.00425 -263064.63825 161996.6297 1.0000000
Listeria-Acutalibacter                       19072.68040 -131929.95251 170075.3133 1.0000000
Lysinibacillus-Acutalibacter                 20966.14467 -143659.37654 185591.6659 1.0000000
Mammaliicoccus-Acutalibacter                 65943.99575 -107586.54025 239474.5318 0.9999999
Moorella-Acutalibacter                       19409.34509 -164647.58303 203466.2732 1.0000000
Oenococcus-Acutalibacter                    -13583.71550 -174241.77366 147074.3427 1.0000000
Paenibacillus-Acutalibacter                 -19447.90314 -170510.44585 131614.6396 1.0000000
Parageobacillus-Acutalibacter               -12063.15278 -196120.08091 171993.7753 1.0000000
Pediococcus-Acutalibacter                   -40436.00425 -252966.63825 172094.6297 1.0000000
Peptoclostridium-Acutalibacter               72025.34722 -140505.28678 284555.9812 1.0000000
Psychrobacillus-Acutalibacter                16189.34722 -157341.18879 189719.8832 1.0000000
Roseburia-Acutalibacter                     -13990.65278 -198047.58091 170066.2753 1.0000000
Ruminococcus-Acutalibacter                  -22198.65278 -184521.60575 140124.3002 1.0000000
Sporosarcina-Acutalibacter                  -33991.65703 -246522.29103 178538.9770 1.0000000
Staphylococcus-Acutalibacter                 25806.96672 -124576.66829 176190.6017 1.0000000
Streptococcus-Acutalibacter                  -2786.10448 -153164.63236 147592.4234 1.0000000
Terrisporobacter-Acutalibacter              -16788.15278 -184808.37178 151232.0662 1.0000000
Tetragenococcus-Acutalibacter               -21758.50000 -205815.42813 162298.4281 1.0000000
Thermoanaerobacterium-Acutalibacter         -17362.65278 -229893.28678 195167.9812 1.0000000
Virgibacillus-Acutalibacter                 -11284.65278 -223815.28678 201245.9812 1.0000000
Weissella-Acutalibacter                     -19123.14407 -179781.20223 141534.9141 1.0000000
Weizmannia-Acutalibacter                    -45605.65703 -258136.29103 166924.9770 1.0000000
Aerococcus-Aeribacillus                      63051.64853 -149478.98546 275582.2825 1.0000000
Agathobaculum-Aeribacillus                  -46027.00425 -230083.93238 138029.9239 1.0000000
Alicyclobacillus-Aeribacillus                29316.99575 -183213.63825 241847.6297 1.0000000
Amedibacillus-Aeribacillus                  -39332.00000 -223388.92813 144724.9281 1.0000000
Anaerostipes-Aeribacillus                   -15142.00000 -188672.53600 158388.5360 1.0000000
Anoxybacillus-Aeribacillus                  -10759.00000 -223289.63400 201771.6340 1.0000000
Bacillus-Aeribacillus                        25409.55007 -125033.80905 175852.9092 1.0000000
Blautia-Aeribacillus                         -5540.00000 -218070.63400 206990.6340 1.0000000
Brevibacillus-Aeribacillus                    8611.99884 -148352.27687 165576.2745 1.0000000
Brochothrix-Aeribacillus                     23916.15119 -135481.82431 183314.1267 1.0000000
Butyrivibrio-Aeribacillus                   -38395.50212 -200718.45509 123927.4508 1.0000000
Caldibacillus-Aeribacillus                  -14290.00000 -226820.63400 198240.6340 1.0000000
Carnobacterium-Aeribacillus                 -13790.01813 -187320.55413 159740.5179 1.0000000
Clostridioides-Aeribacillus                  18918.30000 -135074.77437 172911.3744 1.0000000
Clostridium-Aeribacillus                    -27386.15277 -178236.18066 123463.8751 1.0000000
Cytobacillus-Aeribacillus                   -68494.00425 -281024.63825 144036.6297 1.0000000
Dorea-Aeribacillus                          -13286.00000 -225816.63400 199244.6340 1.0000000
Enterocloster-Aeribacillus                   50180.83333 -112142.11963 212503.7863 1.0000000
Enterococcus-Aeribacillus                     5211.67217 -145312.37526 155735.7196 1.0000000
Erysipelothrix-Aeribacillus                  10892.50000 -173164.42813 194949.4281 1.0000000
Faecalibacterium-Aeribacillus               -12014.66773 -168432.97908 144403.6436 1.0000000
Flavonifractor-Aeribacillus                 -19455.35005 -192985.88605 154075.1860 1.0000000
Geobacillus-Aeribacillus                     -9834.46752 -165044.89739 145375.9624 1.0000000
Hungatella-Aeribacillus                     -74899.00425 -287429.63825 137631.6297 1.0000000
Kurthia-Aeribacillus                        -35751.00000 -248281.63400 176779.6340 1.0000000
Lacticaseibacillus-Aeribacillus                146.90278 -153846.17159 154139.9772 1.0000000
Lactiplantibacillus-Aeribacillus              8622.15066 -175434.77747 192679.0788 1.0000000
Lactobacillus-Aeribacillus                   12886.63125 -138152.31347 163925.5760 1.0000000
Lactococcus-Aeribacillus                    -28856.33588 -179323.15074 121610.4790 1.0000000
Latilactobacillus-Aeribacillus                6371.58136 -149184.91456 161928.0773 1.0000000
Leuconostoc-Aeribacillus                    -34622.30891 -188003.08235 118758.4645 1.0000000
Levilactobacillus-Aeribacillus               67921.64853 -144608.98546 280452.2825 1.0000000
Liquorilactobacillus-Aeribacillus           -42839.35147 -255369.98546 169691.2825 1.0000000
Listeria-Aeribacillus                        26767.33319 -124235.29973 177769.9661 1.0000000
Lysinibacillus-Aeribacillus                  28660.79745 -135964.72376 193286.3187 1.0000000
Mammaliicoccus-Aeribacillus                  73638.64853  -99891.88747 247169.1845 0.9999964
Moorella-Aeribacillus                        27103.99788 -156952.93025 211160.9260 1.0000000
Oenococcus-Aeribacillus                      -5889.06272 -166547.12087 154768.9954 1.0000000
Paenibacillus-Aeribacillus                  -11753.25035 -162815.79307 139309.2924 1.0000000
Parageobacillus-Aeribacillus                 -4368.50000 -188425.42813 179688.4281 1.0000000
Pediococcus-Aeribacillus                    -32741.35147 -245271.98546 179789.2825 1.0000000
Peptoclostridium-Aeribacillus                79720.00000 -132810.63400 292250.6340 0.9999999
Psychrobacillus-Aeribacillus                 23884.00000 -149646.53600 197414.5360 1.0000000
Roseburia-Aeribacillus                       -6296.00000 -190352.92813 177760.9281 1.0000000
Ruminococcus-Aeribacillus                   -14504.00000 -176826.95297 147818.9530 1.0000000
Sporosarcina-Aeribacillus                   -26297.00425 -238827.63825 186233.6297 1.0000000
Staphylococcus-Aeribacillus                  33501.61951 -116882.01551 183885.2545 1.0000000
Streptococcus-Aeribacillus                    4908.54831 -145469.97958 155287.0762 1.0000000
Terrisporobacter-Aeribacillus                -9093.50000 -177113.71900 158926.7190 1.0000000
Tetragenococcus-Aeribacillus                -14063.84722 -198120.77534 169993.0809 1.0000000
Thermoanaerobacterium-Aeribacillus           -9668.00000 -222198.63400 202862.6340 1.0000000
Virgibacillus-Aeribacillus                   -3590.00000 -216120.63400 208940.6340 1.0000000
Weissella-Aeribacillus                      -11428.49129 -172086.54944 149229.5669 1.0000000
Weizmannia-Aeribacillus                     -37911.00425 -250441.63825 174619.6297 1.0000000
Agathobaculum-Aerococcus                   -109078.65278 -293135.58091  74978.2753 0.9827791
Alicyclobacillus-Aerococcus                 -33734.65278 -246265.28678 178795.9812 1.0000000
Amedibacillus-Aerococcus                   -102383.64853 -286440.57666  81673.2796 0.9949667
Anaerostipes-Aerococcus                     -78193.64853 -251724.18454  95336.8875 0.9999767
Anoxybacillus-Aerococcus                    -73810.64853 -286341.28253 138719.9855 1.0000000
Bacillus-Aerococcus                         -37642.09847 -188085.45758 112801.2606 1.0000000
Blautia-Aerococcus                          -68591.64853 -281122.28253 143938.9855 1.0000000
Brevibacillus-Aerococcus                    -54439.64969 -211403.92540 102524.6260 1.0000000
Brochothrix-Aerococcus                      -39135.49734 -198533.47284 120262.4782 1.0000000
Butyrivibrio-Aerococcus                    -101447.15066 -263770.10363  60875.8023 0.9580891
Caldibacillus-Aerococcus                    -77341.64853 -289872.28253 135188.9855 1.0000000
Carnobacterium-Aerococcus                   -76841.66667 -250372.20267  96688.8693 0.9999863
Clostridioides-Aerococcus                   -44133.34853 -198126.42290 109859.7258 1.0000000
Clostridium-Aerococcus                      -90437.80130 -241287.82920  60412.2266 0.9788729
Cytobacillus-Aerococcus                    -131545.65278 -344076.28678  80984.9812 0.9640153
Dorea-Aerococcus                            -76337.64853 -288868.28253 136192.9855 1.0000000
Enterocloster-Aerococcus                    -12870.81520 -175193.76817 149452.1378 1.0000000
Enterococcus-Aerococcus                     -57839.97636 -208364.02380  92684.0711 0.9999999
Erysipelothrix-Aerococcus                   -52159.14853 -236216.07666 131897.7796 1.0000000
Faecalibacterium-Aerococcus                 -75066.31626 -231484.62762  81351.9951 0.9998581
Flavonifractor-Aerococcus                   -82506.99858 -256037.53459  91023.5374 0.9998903
Geobacillus-Aerococcus                      -72886.11605 -228096.54592  82324.3138 0.9999225
Hungatella-Aerococcus                      -137950.65278 -350481.28678  74579.9812 0.9269790
Kurthia-Aerococcus                          -98802.64853 -311333.28253 113727.9855 0.9999419
Lacticaseibacillus-Aerococcus               -62904.74575 -216897.82012  91088.3286 0.9999990
Lactiplantibacillus-Aerococcus              -54429.49788 -238486.42600 129627.4303 1.0000000
Lactobacillus-Aerococcus                    -50165.01728 -201203.96200 100873.9274 1.0000000
Lactococcus-Aerococcus                      -91907.98442 -242374.79928  58558.8304 0.9709805
Latilactobacillus-Aerococcus                -56680.06718 -212236.56310  98876.4287 1.0000000
Leuconostoc-Aerococcus                      -97673.95745 -251054.73089  55706.8160 0.9443662
Levilactobacillus-Aerococcus                  4870.00000 -207660.63400 217400.6340 1.0000000
Liquorilactobacillus-Aerococcus            -105891.00000 -318421.63400 106639.6340 0.9996156
Listeria-Aerococcus                         -36284.31535 -187286.94826 114718.3176 1.0000000
Lysinibacillus-Aerococcus                   -34390.85108 -199016.37229 130234.6701 1.0000000
Mammaliicoccus-Aerococcus                    10587.00000 -162943.53600 184117.5360 1.0000000
Moorella-Aerococcus                         -35947.65066 -220004.57878 148109.2775 1.0000000
Oenococcus-Aerococcus                       -68940.71125 -229598.76941  91717.3469 0.9999949
Paenibacillus-Aerococcus                    -74804.89889 -225867.44160  76257.6438 0.9996721
Parageobacillus-Aerococcus                  -67420.14853 -251477.07666 116636.7796 1.0000000
Pediococcus-Aerococcus                      -95793.00000 -308323.63400 116737.6340 0.9999766
Peptoclostridium-Aerococcus                  16668.35147 -195862.28253 229198.9855 1.0000000
Psychrobacillus-Aerococcus                  -39167.64853 -212698.18454 134362.8875 1.0000000
Roseburia-Aerococcus                        -69347.64853 -253404.57666 114709.2796 0.9999999
Ruminococcus-Aerococcus                     -77555.64853 -239878.60150  84767.3044 0.9998744
Sporosarcina-Aerococcus                     -89348.65278 -301879.28678 123181.9812 0.9999974
Staphylococcus-Aerococcus                   -29550.02903 -179933.66405 120833.6060 1.0000000
Streptococcus-Aerococcus                    -58143.10023 -208521.62811  92235.4277 0.9999998
Terrisporobacter-Aerococcus                 -72145.14853 -240165.36753  95875.0705 0.9999948
Tetragenococcus-Aerococcus                  -77115.49575 -261172.42388 106941.4324 0.9999976
Thermoanaerobacterium-Aerococcus            -72719.64853 -285250.28253 139810.9855 1.0000000
Virgibacillus-Aerococcus                    -66641.64853 -279172.28253 145888.9855 1.0000000
Weissella-Aerococcus                        -74480.13982 -235138.19798  86177.9183 0.9999463
Weizmannia-Aerococcus                      -100962.65278 -313493.28678 111567.9812 0.9998929
Alicyclobacillus-Agathobaculum               75344.00000 -108712.92813 259400.9281 0.9999989
Amedibacillus-Agathobaculum                   6695.00425 -143586.84826 156976.8568 1.0000000
Anaerostipes-Agathobaculum                   30885.00425 -106302.93009 168072.9386 1.0000000
Anoxybacillus-Agathobaculum                  35268.00425 -148788.92388 219324.9324 1.0000000
Bacillus-Agathobaculum                       71436.55431  -35057.04505 177930.1537 0.8877036
Blautia-Agathobaculum                        40487.00425 -143569.92388 224543.9324 1.0000000
Brevibacillus-Agathobaculum                  54639.00309  -60883.57588 170161.5821 0.9999052
Brochothrix-Agathobaculum                    69943.15544  -48865.08079 188751.3917 0.9847342
Butyrivibrio-Agathobaculum                    7631.50212 -115073.11663 130336.1209 1.0000000
Caldibacillus-Agathobaculum                  31737.00425 -152319.92388 215793.9324 1.0000000
Carnobacterium-Agathobaculum                 32236.98612 -104950.94822 169424.9205 1.0000000
Clostridioides-Agathobaculum                 64945.30425  -46506.70047 176397.3090 0.9873647
Clostridium-Agathobaculum                    18640.85148  -88426.47929 125708.1822 1.0000000
Cytobacillus-Agathobaculum                  -22467.00000 -206523.92813 161589.9281 1.0000000
Dorea-Agathobaculum                          32741.00425 -151315.92388 216797.9324 1.0000000
Enterocloster-Agathobaculum                  96207.83758  -26496.78117 218912.4563 0.5342628
Enterococcus-Agathobaculum                   51238.67642  -55368.88081 157846.2337 0.9998522
Erysipelothrix-Agathobaculum                 56919.50425  -93362.34826 207201.3568 0.9999999
Faecalibacterium-Agathobaculum               34012.33652  -80767.32426 148791.9973 1.0000000
Flavonifractor-Agathobaculum                 26571.65420 -110616.28014 163759.5885 1.0000000
Geobacillus-Agathobaculum                    36192.53673  -76935.53204 149320.6055 1.0000000
Hungatella-Agathobaculum                    -28872.00000 -212928.92813 155184.9281 1.0000000
Kurthia-Agathobaculum                        10276.00425 -173780.92388 194332.9324 1.0000000
Lacticaseibacillus-Agathobaculum             46173.90703  -65278.09769 157625.9118 0.9999984
Lactiplantibacillus-Agathobaculum            54649.15491  -95632.69760 204931.0074 1.0000000
Lactobacillus-Agathobaculum                  58913.63550  -48419.70147 166246.9725 0.9962060
Lactococcus-Agathobaculum                    17170.66837  -89356.06432 123697.4011 1.0000000
Latilactobacillus-Agathobaculum              52398.58561  -61203.81677 166000.9880 0.9999537
Leuconostoc-Agathobaculum                    11404.69534  -99199.75332 122009.1440 1.0000000
Levilactobacillus-Agathobaculum             113948.65278  -70108.27534 298005.5809 0.9638801
Liquorilactobacillus-Agathobaculum            3187.65278 -180869.27534 187244.5809 1.0000000
Listeria-Agathobaculum                       72794.33744  -34487.89572 180076.5706 0.8710198
 [ reached getOption("max.print") -- omitted 1346 rows ]
TukeyHSD(block, which = c("predicted_label", "f_spor"))
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Genome.Length..bp. ~ predicted_label + f_spor + Host, data = inph.all)

$predicted_label
                       diff     lwr      upr p adj
virulent-temperate 39312.13 36778.2 41846.05     0

$f_spor
               diff      lwr      upr p adj
TRUE-FALSE 20058.93 17128.38 22989.48     0
tkey
Error: object 'tkey' not found
gc.spor <- ggplot(inph.spor, aes(x = factor(predicted_label), fill = factor(predicted_label), y = molGC....)) + 
  geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2)  + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("GC %") + xlab("") + ggtitle("") + labs(fill="Lifestyle")+ ylim(0, 75)
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
inph.no <- subset(inph.all, inph.all$f_spor==FALSE)  

gc.no <- ggplot(inph.no, aes(x = factor(predicted_label), fill = factor(predicted_label), y = molGC....)) + 
  geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2)  + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("GC %") + xlab("") + ggtitle("") + labs(fill="Lifestyle") + ylim(0, 75) + theme(legend.position = "none")
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
gc.amount <- plot_grid(gc.no, gc.spor, labels = c('Nonsporulating Host', 'Sporulating Host'), label_size = 12, rel_widths = c(1.5, 2))

gc.amount

pairs(em)
 contrast                         estimate    SE   df t.ratio p.value
 temperate FALSE - virulent FALSE   -0.127 0.116 3285  -1.096  0.6922
 temperate FALSE - temperate TRUE    0.897 0.488 3285   1.837  0.2560
 temperate FALSE - virulent TRUE     0.770 0.509 3285   1.514  0.4292
 virulent FALSE - temperate TRUE     1.023 0.494 3285   2.070  0.1630
 virulent FALSE - virulent TRUE      0.897 0.488 3285   1.837  0.2560
 temperate TRUE - virulent TRUE     -0.127 0.116 3285  -1.096  0.6922

Results are averaged over the levels of: Host 
P value adjustment: tukey method for comparing a family of 4 estimates 
tRNA.spor <-  ggplot(inph.spor, aes(x = factor(predicted_label), fill = factor(predicted_label), y = tRNAs)) + 
  geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2)  + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("# of tRNAs") + xlab("") + ggtitle("") + labs(fill="Lifestyle")+ ylim(0, 30)
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
inph.no <- subset(inph.all, inph.all$f_spor==FALSE)  

tRNA.no <-ggplot(inph.no, aes(x = factor(predicted_label), fill = factor(predicted_label), y = tRNAs)) + 
  geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2)  + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("# of tRNAs") + xlab("") + ggtitle("") + labs(fill="Lifestyle") + ylim(0, 30) + theme(legend.position="none")
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
tRNA.amount <- plot_grid(tRNA.no, tRNA.spor, labels = c('Nonsporulating Host', 'Sporulating Host'), label_size = 12, rel_widths = c(1.5, 2))
Warning: Removed 847 rows containing missing values or values outside the scale range (`geom_point()`).Warning: Removed 310 rows containing missing values or values outside the scale range (`geom_point()`).
tRNA.amount


twoway_block <- aov(tRNAs ~ predicted_label+ f_spor+Host, data = inph.all)

summary(twoway_block)
                  Df Sum Sq Mean Sq F value  Pr(>F)    
predicted_label    1   4293    4293 417.102 < 2e-16 ***
f_spor             1    106     106  10.255 0.00138 ** 
Host              55   4169      76   7.363 < 2e-16 ***
Residuals       3285  33814      10                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
library(emmeans)
em <- emmeans(twoway_block, ~ predicted_label * f_spor)
NOTE: A nesting structure was detected in the fitted model:
    Host %in% f_spor
pairs(em)
 contrast                         estimate    SE   df t.ratio p.value
 temperate FALSE - virulent FALSE    -2.09 0.136 3285 -15.364  <.0001
 temperate FALSE - temperate TRUE     0.59 0.575 3285   1.025  0.7346
 temperate FALSE - virulent TRUE     -1.50 0.599 3285  -2.504  0.0595
 virulent FALSE - temperate TRUE      2.68 0.582 3285   4.603  <.0001
 virulent FALSE - virulent TRUE       0.59 0.575 3285   1.025  0.7346
 temperate TRUE - virulent TRUE      -2.09 0.136 3285 -15.364  <.0001

Results are averaged over the levels of: Host 
P value adjustment: tukey method for comparing a family of 4 estimates 
### lifestyle and sporulation have impact on tRNAs 

## nonsporulating temp vs. virulent are different
## sporulating temp and virulent are different

## Virulent NON-SPOR and virulent SPOR are different p=0.0125

## Temperate NON-SPOR and Temperate SPOR are different, p= 0.0125
CDS.spor <- ggplot(inph.spor, aes(x = factor(predicted_label), fill = factor(predicted_label), y = Number.CDS)) + 
  geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2)  + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("# of Coding Regions") + xlab("") + ggtitle("") + labs(fill="Lifestyle")+ ylim(0, 350)
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
inph.no <- subset(inph.all, inph.all$f_spor==FALSE)  

CDS.no <- ggplot(inph.no, aes(x = factor(predicted_label), fill = factor(predicted_label), y = Number.CDS)) + 
  geom_boxplot(binaxis = "y", stackdir = "center", position = "dodge") + geom_jitter(width = 0.2)  + scale_fill_manual(values=pal2, labels = c ("Temperate", "Lytic")) + ylab("# of Coding Regions") + xlab("") + ggtitle("") + labs(fill="Lifestyle") + ylim(0, 350) + theme(legend.position="none")
Warning: Ignoring unknown parameters: `binaxis` and `stackdir`
CDS.amount <- plot_grid(CDS.no, CDS.spor, labels = c('Nonsporulating Host', 'Sporulating Host'), label_size = 12, rel_widths = c(1.5, 2))
Warning: Removed 1 row containing non-finite outside the scale range (`stat_boxplot()`).Warning: Removed 1 row containing missing values or values outside the scale range (`geom_point()`).
CDS.amount



twoway <- aov(Number.CDS ~ predicted_label+ f_spor+Host, data = inph.all)
## lifestyle and sporulation both an impact on number of CDS



summary(twoway)
                  Df  Sum Sq Mean Sq F value Pr(>F)    
predicted_label    1 3216516 3216516  1165.4 <2e-16 ***
f_spor             1  782157  782157   283.4 <2e-16 ***
Host              55 3157901   57416    20.8 <2e-16 ***
Residuals       3285 9066256    2760                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
library(emmeans)
em <- emmeans(twoway, ~ predicted_label * f_spor)
NOTE: A nesting structure was detected in the fitted model:
    Host %in% f_spor
pairs(em)
 contrast                         estimate   SE   df t.ratio p.value
 temperate FALSE - virulent FALSE    -63.8 2.23 3285 -28.640  <.0001
 temperate FALSE - temperate TRUE    -13.3 9.41 3285  -1.418  0.4881
 temperate FALSE - virulent TRUE     -77.1 9.81 3285  -7.862  <.0001
 virulent FALSE - temperate TRUE      50.4 9.53 3285   5.292  <.0001
 virulent FALSE - virulent TRUE      -13.3 9.41 3285  -1.418  0.4881
 temperate TRUE - virulent TRUE      -63.8 2.23 3285 -28.640  <.0001

Results are averaged over the levels of: Host 
P value adjustment: tukey method for comparing a family of 4 estimates 
## lifestyle and sporulation both an impact on number of CDS <0.001


## all groups (e.g. temperate non-spor vs. temperate spor) are different from each other! 
ggsave(here("data/inphared_db/inphared_desc.png"))
Saving 7 x 7 in image
#inph.spor 
#inph.no

library(ggpubr)

gvT <- ggplot(inph.all, aes(Genome.Length..bp., tRNAs, fill=phage_type, colour = phage_type, shape = f_spor)) +
  geom_point() +
  geom_smooth(method="lm")+ # Add regression line
 stat_regline_equation(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
                        label.x.npc = "middle", label.y.npc = "top" )# Add equation#+ ylim(0, 25) #+ xlim(0, 400000)


cvT <- ggplot(inph.all, aes(Number.CDS, tRNAs, fill=phage_type, colour = phage_type, shape = f_spor)) +
  geom_point() +
  geom_smooth(method="lm")+ # Add regression line
 stat_regline_equation(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
                        label.x.npc = "middle", label.y.npc = "top" )# Add equation#+ ylim(0, 25) #+ xlim(0, 400000)

MvT <- ggplot(inph.all, aes(molGC...., tRNAs, fill=phage_type, colour = phage_type, shape = f_spor)) +
  geom_point() +
  geom_smooth(method="lm")+ # Add regression line
 stat_regline_equation(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
                        label.x.npc = "middle", label.y.npc = "top" )# Add equation#+ ylim(0, 25) #+ xlim(0, 400000)

MvT  ## not interesting lol


gvC <- ggplot(inph.all, aes(Genome.Length..bp., Number.CDS, fill=phage_type, colour = phage_type, shape = f_spor)) +
  geom_point() +
  geom_smooth(method="lm")+ # Add regression line
 stat_regline_equation(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
                        label.x.npc = "left", label.y.npc = "top" )# Add equation#+ ylim(0, 25) #+ xlim(0, 400000)


GvGC <- ggplot(inph.all, aes(Genome.Length..bp., molGC...., fill=phage_type, colour = phage_type, shape = f_spor)) +
  geom_point() + geom_smooth(method="lm") +
 stat_regline_equation(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")),
                        label.x.npc = "middle", label.y.npc = "top" )
GvGC


all.line <- plot_grid(
  gvT, cvT, gvC, GvGC, ncol=1)
`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'
 # labels = c('Genome Size', 'GC %', 'Predicted CD Regions', 'Predicted tRNAs'), ncol = 1)

all.line

ggsave(here("data/inphared_db/inphared_linear.png"), height=11, width=8)

NA
NA
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoY293cGxvdCkKaGVyZSgiUkVBRE1FLm1kIikKZHJfaGVyZSgpCgpwYWwyIDwtIGMoIiMwMTViNTgiLCAiIzU5NjJiNSIpCnBhbDIuZmxpcCA8LSBjKCIjNTk2MmI1IiwgIiMwMTViNTgiKQppbnBoIDwtIHJlYWQuY3N2KCJkYXRhL2lucGhhcmVkX2RiLzE0QXByMjAyNV9rbm93bnNwb3Jlc3RhdHVzLmNzdiIsIHJvdy5uYW1lcz0xKQppbnBoJHNwb3J1bGF0aW9uIDwtICJUIgppbnBoJHNwb3J1bGF0aW9uIDwtIGlmZWxzZShpbnBoJGZfc3Bvcj09VFJVRSwgIlNwcm91bGF0aW5nSG9zdCIsICJOb25zcG9ydWxhdGluZ0hvc3QiKQoKaW5waCA8LSB1bml0ZShpbnBoLCAicGhhZ2VfdHlwZSIsIGMoInNwb3J1bGF0aW9uIiwgInByZWRpY3RlZF9sYWJlbCIpLCBzZXAgPSAiXyIsIHJlbW92ZSA9IEZBTFNFLCBuYS5ybSA9IEZBTFNFKQoKCmBgYAoKIyMjIGNvbXBhcmUgZ2Vub21lIHNpemUgb2YgdGVtcGVyYXRlIHZzLiBseXRpYwpgYGB7cn0KaW5waC5hbGwgPC0gaW5waAojaW5waDwtIHN1YnNldChpbnBoLmFsbCwgaW5waC5hbGwkSnVtYm9waGFnZT09RkFMU0UpCgoKZ2dwbG90KGlucGguYWxsLCBhZXMoeCA9IGZhY3RvcihmX3Nwb3IpLCBmaWxsID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIHkgPSBHZW5vbWUuTGVuZ3RoLi5icC4pKSArIAogIGdlb21fYm94cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiUGhhZ2UgR2Vub21lIFNpemUgKGJwKSIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCJJTlBIQVJFRCwgd2l0aCBqdW1ib3BoYWdlcyIpICsgbGFicyhmaWxsPSJMaWZlc3R5bGUiKQoKCiMgZ2dwbG90KGlucGgsIGFlcyh4ID0gZmFjdG9yKGZfc3BvciksIGZpbGwgPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgeSA9IEdlbm9tZS5MZW5ndGguLmJwLikpIAojICBnZW9tX2JveHBsb3QoYmluYXhpcyA9ICJ5Iiwgc3RhY2tkaXIgPSAiY2VudGVyIiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiUGhhZ2UgIyBHZW5vbWUgU2l6ZSAoYnApIikgKyB4bGFiKCIiKSArIGdndGl0bGUoIklOUEhBUkVELCBubyBqdW1ib3BoYWdlcyIpICsgbGFicyhmaWxsPSJMaWZlc3R5bGUiKQogIAogIAogIAogIAogIAppbnBoLnNwb3IgPC0gc3Vic2V0KGlucGguYWxsLCBpbnBoLmFsbCRmX3Nwb3I9PVRSVUUpICAKCnNpemUuc3BvciA8LSBnZ3Bsb3QoaW5waC5zcG9yLCBhZXMoeCA9IGZhY3RvcihwcmVkaWN0ZWRfbGFiZWwpLCBmaWxsID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIHkgPSBHZW5vbWUuTGVuZ3RoLi5icC4pKSArIAogIGdlb21fYm94cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiUGhhZ2UgR2Vub21lIFNpemUgKGJwKSIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCIiKSArIGxhYnMoZmlsbD0iTGlmZXN0eWxlIikrIHlsaW0oMCwgMTAwMDAwMCkKCgoKaW5waC5ubyA8LSBzdWJzZXQoaW5waC5hbGwsIGlucGguYWxsJGZfc3Bvcj09RkFMU0UpICAKCnNpemUubm8gPC0gZ2dwbG90KGlucGgubm8sIGFlcyh4ID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIGZpbGwgPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgeSA9IEdlbm9tZS5MZW5ndGguLmJwLikpICsgCiAgZ2VvbV9ib3hwbG90KGJpbmF4aXMgPSAieSIsIHN0YWNrZGlyID0gImNlbnRlciIsIHBvc2l0aW9uID0gImRvZGdlIikgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXBhbDIsIGxhYmVscyA9IGMgKCJUZW1wZXJhdGUiLCAiTHl0aWMiKSkgKyB5bGFiKCJQaGFnZSBHZW5vbWUgU2l6ZSAoYnApIikgKyB4bGFiKCIiKSArIGdndGl0bGUoIiIpICsgbGFicyhmaWxsPSJMaWZlc3R5bGUiKSArIHlsaW0oMCwgMTAwMDAwMCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgoKCmdlbm9tZS5zaXplIDwtIHBsb3RfZ3JpZChzaXplLm5vLCBzaXplLnNwb3IsIGxhYmVscyA9IGMoJ05vbnNwb3J1bGF0aW5nIEhvc3QnLCAnU3BvcnVsYXRpbmcgSG9zdCcpLCBsYWJlbF9zaXplID0gMTIsIHJlbF93aWR0aHMgPSBjKDEuNSwgMikpCgpnZW5vbWUuc2l6ZQpgYGAKCgpgYGB7cn0KCmlucGguYWxsJGZfc3BvciA8LSBhcy5mYWN0b3IoaW5waC5hbGwkZl9zcG9yKQppbnBoLmFsbCRwcmVkaWN0ZWRfbGFiZWwgPC0gYXMuZmFjdG9yKGlucGguYWxsJHByZWRpY3RlZF9sYWJlbCkKaW5waC5hbGwkSG9zdCA8LSBhcy5mYWN0b3IoaW5waC5hbGwkSG9zdCkKCiNpbnBoIDwtIHN1YnNldChpbnBoLCBpbnBoJEp1bWJvcGhhZ2U9PUZBTFNFKQoKb25ld2F5IDwtIGFvdihHZW5vbWUuTGVuZ3RoLi5icC4gfiBwcmVkaWN0ZWRfbGFiZWwsIGRhdGEgPSBpbnBoLmFsbCkKCnN1bW1hcnkob25ld2F5KQoKCnR3b3dheSA8LSBhb3YoR2Vub21lLkxlbmd0aC4uYnAuIH4gcHJlZGljdGVkX2xhYmVsICsgZl9zcG9yLCBkYXRhID0gaW5waC5hbGwpCgpzdW1tYXJ5KHR3b3dheSkKCgp0d293YXkuaW50IDwtIGFvdihHZW5vbWUuTGVuZ3RoLi5icC4gfiBwcmVkaWN0ZWRfbGFiZWwgKiBmX3Nwb3IsIGRhdGEgPSBpbnBoLmFsbCkKCnN1bW1hcnkodHdvd2F5LmludCkKCgpibG9jayA8LSBhb3YoR2Vub21lLkxlbmd0aC4uYnAuIH5wcmVkaWN0ZWRfbGFiZWwgKyBmX3Nwb3IgKyBIb3N0LCBkYXRhID0gaW5waC5hbGwpCgpzdW1tYXJ5KGJsb2NrKQoKYmxvY2tfaW50IDwtIGFvdihHZW5vbWUuTGVuZ3RoLi5icC4gfiBwcmVkaWN0ZWRfbGFiZWwgKyBmX3Nwb3IgKiBIb3N0LCBkYXRhID0gaW5waC5hbGwpCnN1bW1hcnkoYmxvY2tfaW50KQphbGxfaW50IDwtIGFvdihHZW5vbWUuTGVuZ3RoLi5icC4gfiBwcmVkaWN0ZWRfbGFiZWwgKiBmX3Nwb3IgKiBIb3N0LCBkYXRhID0gaW5waC5hbGwpCnN1bW1hcnkoYWxsX2ludCkKCmxpYnJhcnkoQUlDY21vZGF2ZykKCm1vZGVsLnNldCA8LSBsaXN0KG9uZXdheSwgdHdvd2F5LCB0d293YXkuaW50LCBibG9jaywgYmxvY2tfaW50KQptb2RlbC5uYW1lcyA8LSBjKCJvbmUud2F5IiwgInR3by53YXkiLCAiaW50ZXJhY3Rpb24iLCAiYmxvY2tpbmciLCAiYmxvY2tfaW50IikKCmFpY3RhYihtb2RlbC5zZXQsIG1vZG5hbWVzID0gbW9kZWwubmFtZXMpCgpwYXIobWZyb3c9YygyLDIpKQpwbG90KHR3b3dheS5pbnQpCnBhcihtZnJvdz1jKDEsMSkpCgp0ZXJtcyhibG9jaykKClR1a2V5SFNEKGJsb2NrKSAgIyBvcjoKVHVrZXlIU0QoYmxvY2ssIHdoaWNoID0gYygicHJlZGljdGVkX2xhYmVsIiwgImZfc3BvciIpKQoKCnRrZXkKCmtydXNrYWwudGVzdChwcmVkaWN0ZWRfbGFiZWwgfiBHZW5vbWUuTGVuZ3RoLi5icC4sIGRhdGEgPSBpbnBoKQoKCgoKbGlicmFyeShlbW1lYW5zKQplbSA8LSBlbW1lYW5zKGJsb2NrLCB+IHByZWRpY3RlZF9sYWJlbCAqIGZfc3BvcikKcGFpcnMoZW0pCgojIyBubyBzcG9yIHRlbXAgdnMuIHZpciwgZGlmZmVyZW50CiMjIHNwb3IgdGVtcCB2cy4gdmlyLCBkaWZmZXJlbnQKCiMjIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBzcG9yIHRlbXAgYW5kIG5vbnNwb3IgdGVtcAojIyBubyBkaWZmZXJlbmNlIGJldHdlZW4gc3BvciB2aXIgYW5kIG5vbnNwb3IgdmlyCgoKYGBgCgpgYGB7cn0KZ2Muc3BvciA8LSBnZ3Bsb3QoaW5waC5zcG9yLCBhZXMoeCA9IGZhY3RvcihwcmVkaWN0ZWRfbGFiZWwpLCBmaWxsID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIHkgPSBtb2xHQy4uLi4pKSArIAogIGdlb21fYm94cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiR0MgJSIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCIiKSArIGxhYnMoZmlsbD0iTGlmZXN0eWxlIikrIHlsaW0oMCwgNzUpCgoKCmlucGgubm8gPC0gc3Vic2V0KGlucGguYWxsLCBpbnBoLmFsbCRmX3Nwb3I9PUZBTFNFKSAgCgpnYy5ubyA8LSBnZ3Bsb3QoaW5waC5ubywgYWVzKHggPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgZmlsbCA9IGZhY3RvcihwcmVkaWN0ZWRfbGFiZWwpLCB5ID0gbW9sR0MuLi4uKSkgKyAKICBnZW9tX2JveHBsb3QoYmluYXhpcyA9ICJ5Iiwgc3RhY2tkaXIgPSAiY2VudGVyIiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSAgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsMiwgbGFiZWxzID0gYyAoIlRlbXBlcmF0ZSIsICJMeXRpYyIpKSArIHlsYWIoIkdDICUiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiIikgKyBsYWJzKGZpbGw9IkxpZmVzdHlsZSIpICsgeWxpbSgwLCA3NSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgoKCgpnYy5hbW91bnQgPC0gcGxvdF9ncmlkKGdjLm5vLCBnYy5zcG9yLCBsYWJlbHMgPSBjKCdOb25zcG9ydWxhdGluZyBIb3N0JywgJ1Nwb3J1bGF0aW5nIEhvc3QnKSwgbGFiZWxfc2l6ZSA9IDEyLCByZWxfd2lkdGhzID0gYygxLjUsIDIpKQoKZ2MuYW1vdW50CmBgYAoKCmBgYHtyfQoKaW5waC5hbGwkZl9zcG9yIDwtIGFzLmZhY3RvcihpbnBoLmFsbCRmX3Nwb3IpCmlucGguYWxsJHByZWRpY3RlZF9sYWJlbCA8LSBhcy5mYWN0b3IoaW5waC5hbGwkcHJlZGljdGVkX2xhYmVsKQppbnBoLmFsbCRIb3N0IDwtIGFzLmZhY3RvcihpbnBoLmFsbCRIb3N0KQoKI2lucGggPC0gc3Vic2V0KGlucGgsIGlucGgkSnVtYm9waGFnZT09RkFMU0UpCgpvbmV3YXkgPC0gYW92KG1vbEdDLi4uLiB+IHByZWRpY3RlZF9sYWJlbCwgZGF0YSA9IGlucGguYWxsKQoKc3VtbWFyeShvbmV3YXkpCgoKdHdvd2F5IDwtIGFvdihtb2xHQy4uLi4gfiBwcmVkaWN0ZWRfbGFiZWwgKyBmX3Nwb3IsIGRhdGEgPSBpbnBoLmFsbCkKCnN1bW1hcnkodHdvd2F5KQoKCnR3b3dheS5pbnQgPC0gYW92KG1vbEdDLi4uLiB+IHByZWRpY3RlZF9sYWJlbCAqIGZfc3BvciwgZGF0YSA9IGlucGguYWxsKQoKc3VtbWFyeSh0d293YXkuaW50KQoKCmJsb2NrIDwtIGFvdihtb2xHQy4uLi4gfnByZWRpY3RlZF9sYWJlbCArIGZfc3BvciArIEhvc3QsIGRhdGEgPSBpbnBoLmFsbCkKCnN1bW1hcnkoYmxvY2spCgpibG9ja19pbnQgPC0gYW92KG1vbEdDLi4uLiB+IHByZWRpY3RlZF9sYWJlbCArIGZfc3BvciAqIEhvc3QsIGRhdGEgPSBpbnBoLmFsbCkKc3VtbWFyeShibG9ja19pbnQpCmFsbF9pbnQgPC0gYW92KG1vbEdDLi4uLiB+IHByZWRpY3RlZF9sYWJlbCAqIGZfc3BvciAqIEhvc3QsIGRhdGEgPSBpbnBoLmFsbCkKc3VtbWFyeShhbGxfaW50KQoKbGlicmFyeShBSUNjbW9kYXZnKQoKbW9kZWwuc2V0IDwtIGxpc3Qob25ld2F5LCB0d293YXksIHR3b3dheS5pbnQsIGJsb2NrLCBibG9ja19pbnQpCm1vZGVsLm5hbWVzIDwtIGMoIm9uZS53YXkiLCAidHdvLndheSIsICJpbnRlcmFjdGlvbiIsICJibG9ja2luZyIsICJibG9ja19pbnQiKQoKYWljdGFiKG1vZGVsLnNldCwgbW9kbmFtZXMgPSBtb2RlbC5uYW1lcykKc3VtbWFyeShibG9jaykKCnBhcihtZnJvdz1jKDIsMikpCnBsb3QodHdvd2F5LmludCkKcGFyKG1mcm93PWMoMSwxKSkKCnRlcm1zKGJsb2NrKQoKVHVrZXlIU0QoYmxvY2spICAjIG9yOgoKCgp0a2V5CgprcnVza2FsLnRlc3QocHJlZGljdGVkX2xhYmVsIH4gbW9sR0MuLi4uLCBkYXRhID0gaW5waCkKCgoKCmxpYnJhcnkoZW1tZWFucykKZW0gPC0gZW1tZWFucyhibG9jaywgfiBwcmVkaWN0ZWRfbGFiZWwgKiBmX3Nwb3IpCnBhaXJzKGVtKQoKIyMjIG5vIGVmZmVjdCAKbgoKYGBgCgoKYGBge3J9CnRSTkEuc3BvciA8LSAgZ2dwbG90KGlucGguc3BvciwgYWVzKHggPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgZmlsbCA9IGZhY3RvcihwcmVkaWN0ZWRfbGFiZWwpLCB5ID0gdFJOQXMpKSArIAogIGdlb21fYm94cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiIyBvZiB0Uk5BcyIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCIiKSArIGxhYnMoZmlsbD0iTGlmZXN0eWxlIikrIHlsaW0oMCwgMzApCgoKCmlucGgubm8gPC0gc3Vic2V0KGlucGguYWxsLCBpbnBoLmFsbCRmX3Nwb3I9PUZBTFNFKSAgCgp0Uk5BLm5vIDwtZ2dwbG90KGlucGgubm8sIGFlcyh4ID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIGZpbGwgPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgeSA9IHRSTkFzKSkgKyAKICBnZW9tX2JveHBsb3QoYmluYXhpcyA9ICJ5Iiwgc3RhY2tkaXIgPSAiY2VudGVyIiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSAgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsMiwgbGFiZWxzID0gYyAoIlRlbXBlcmF0ZSIsICJMeXRpYyIpKSArIHlsYWIoIiMgb2YgdFJOQXMiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiIikgKyBsYWJzKGZpbGw9IkxpZmVzdHlsZSIpICsgeWxpbSgwLCAzMCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKCnRSTkEuYW1vdW50IDwtIHBsb3RfZ3JpZCh0Uk5BLm5vLCB0Uk5BLnNwb3IsIGxhYmVscyA9IGMoJ05vbnNwb3J1bGF0aW5nIEhvc3QnLCAnU3BvcnVsYXRpbmcgSG9zdCcpLCBsYWJlbF9zaXplID0gMTIsIHJlbF93aWR0aHMgPSBjKDEuNSwgMikpCgp0Uk5BLmFtb3VudAoKdHdvd2F5X2Jsb2NrIDwtIGFvdih0Uk5BcyB+IHByZWRpY3RlZF9sYWJlbCsgZl9zcG9yK0hvc3QsIGRhdGEgPSBpbnBoLmFsbCkKCnN1bW1hcnkodHdvd2F5X2Jsb2NrKQoKbGlicmFyeShlbW1lYW5zKQplbSA8LSBlbW1lYW5zKHR3b3dheV9ibG9jaywgfiBwcmVkaWN0ZWRfbGFiZWwgKiBmX3Nwb3IpCnBhaXJzKGVtKQoKIyMjIGxpZmVzdHlsZSwgc3BvcnVsYXRpb24sIGFuZCBob3N0LCBoYXZlIGltcGFjdCBvbiB0Uk5BcyAKIyMgbm9uIHNwb3IgdmlyIHZzLiBzcG9yIHRlbXAgYXJlIGRpZmZlcmVudAojIyBzcG9yIHZpciB2cy4gc3BvciB0ZW1wIGFyZSBkaWZmZW50CgojIyB2aXIgc3BvciB2cy4gbm9uIHNwb3IgYXJlIE5PVCBkaWZmZXJlbnQKIyMgdGVtcCBzcG9yIHZzLiBub24gc3BvciBBUkUgTk9UIGRpZmZlcmVudAoKYGBgCgoKYGBge3J9CkNEUy5zcG9yIDwtIGdncGxvdChpbnBoLnNwb3IsIGFlcyh4ID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIGZpbGwgPSBmYWN0b3IocHJlZGljdGVkX2xhYmVsKSwgeSA9IE51bWJlci5DRFMpKSArIAogIGdlb21fYm94cGxvdChiaW5heGlzID0gInkiLCBzdGFja2RpciA9ICJjZW50ZXIiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWwyLCBsYWJlbHMgPSBjICgiVGVtcGVyYXRlIiwgIkx5dGljIikpICsgeWxhYigiIyBvZiBDb2RpbmcgUmVnaW9ucyIpICsgeGxhYigiIikgKyBnZ3RpdGxlKCIiKSArIGxhYnMoZmlsbD0iTGlmZXN0eWxlIikrIHlsaW0oMCwgMzUwKQoKCgppbnBoLm5vIDwtIHN1YnNldChpbnBoLmFsbCwgaW5waC5hbGwkZl9zcG9yPT1GQUxTRSkgIAoKQ0RTLm5vIDwtIGdncGxvdChpbnBoLm5vLCBhZXMoeCA9IGZhY3RvcihwcmVkaWN0ZWRfbGFiZWwpLCBmaWxsID0gZmFjdG9yKHByZWRpY3RlZF9sYWJlbCksIHkgPSBOdW1iZXIuQ0RTKSkgKyAKICBnZW9tX2JveHBsb3QoYmluYXhpcyA9ICJ5Iiwgc3RhY2tkaXIgPSAiY2VudGVyIiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSAgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsMiwgbGFiZWxzID0gYyAoIlRlbXBlcmF0ZSIsICJMeXRpYyIpKSArIHlsYWIoIiMgb2YgQ29kaW5nIFJlZ2lvbnMiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiIikgKyBsYWJzKGZpbGw9IkxpZmVzdHlsZSIpICsgeWxpbSgwLCAzNTApICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgpDRFMuYW1vdW50IDwtIHBsb3RfZ3JpZChDRFMubm8sIENEUy5zcG9yLCBsYWJlbHMgPSBjKCdOb25zcG9ydWxhdGluZyBIb3N0JywgJ1Nwb3J1bGF0aW5nIEhvc3QnKSwgbGFiZWxfc2l6ZSA9IDEyLCByZWxfd2lkdGhzID0gYygxLjUsIDIpKQoKQ0RTLmFtb3VudAoKCnR3b3dheSA8LSBhb3YoTnVtYmVyLkNEUyB+IHByZWRpY3RlZF9sYWJlbCsgZl9zcG9yK0hvc3QsIGRhdGEgPSBpbnBoLmFsbCkKIyMgbGlmZXN0eWxlIGFuZCBzcG9ydWxhdGlvbiBib3RoIGFuIGltcGFjdCBvbiBudW1iZXIgb2YgQ0RTCgoKCnN1bW1hcnkodHdvd2F5KQoKbGlicmFyeShlbW1lYW5zKQplbSA8LSBlbW1lYW5zKHR3b3dheSwgfiBwcmVkaWN0ZWRfbGFiZWwgKiBmX3Nwb3IpCnBhaXJzKGVtKQoKIyMgbGlmZXN0eWxlIGFuZCBzcG9ydWxhdGlvbiBib3RoIGFuIGltcGFjdCBvbiBudW1iZXIgb2YgQ0RTIDwwLjAwMQoKIyMgbm9uc3BvciB0ZW1wIHZzLiB2aXIgYXJlIGRpZmZlcmVudAojIyBzcG9yIHRlbXAgdnMuIHZpciBhcmUgZGlmZmVyZW50CgojIyB2aXIgc3BvciB2cy4gdmlyIG5vIHNwb3IgYXJlIE5PVCBkaWZmZXJlbnQKIyMgdGVtcCBzcG9yIHZzLiB0ZW1wIG5vIHNwb3IgYXJlIE5PVCBkaWZmZXJlbnQKCgpgYGAKYGBge3J9CmFsbCA8LSBwbG90X2dyaWQoCiAgZ2Vub21lLnNpemUsIGdjLmFtb3VudCwgQ0RTLmFtb3VudCwgdFJOQS5hbW91bnQsIG5jb2w9MSkKICMgbGFiZWxzID0gYygnR2Vub21lIFNpemUnLCAnR0MgJScsICdQcmVkaWN0ZWQgQ0QgUmVnaW9ucycsICdQcmVkaWN0ZWQgdFJOQXMnKSwgbmNvbCA9IDEpCgphbGwKCmdnc2F2ZShoZXJlKCJkYXRhL2lucGhhcmVkX2RiL2lucGhhcmVkX2Rlc2MucG5nIiksIGhlaWdodD0xMSwgd2lkdGg9OCkKCmBgYAoKYGBge3J9CiNpbnBoLnNwb3IgCiNpbnBoLm5vCgpsaWJyYXJ5KGdncHVicikKCmd2VCA8LSBnZ3Bsb3QoaW5waC5hbGwsIGFlcyhHZW5vbWUuTGVuZ3RoLi5icC4sIHRSTkFzLCBmaWxsPXBoYWdlX3R5cGUsIGNvbG91ciA9IHBoYWdlX3R5cGUsIHNoYXBlID0gZl9zcG9yKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpKyAjIEFkZCByZWdyZXNzaW9uIGxpbmUKIHN0YXRfcmVnbGluZV9lcXVhdGlvbihhZXMobGFiZWwgPSBwYXN0ZSguLmVxLmxhYmVsLi4sIC4ucnIubGFiZWwuLiwgc2VwID0gIn5+fn4iKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLngubnBjID0gIm1pZGRsZSIsIGxhYmVsLnkubnBjID0gInRvcCIgKSMgQWRkIGVxdWF0aW9uIysgeWxpbSgwLCAyNSkgIysgeGxpbSgwLCA0MDAwMDApCgoKY3ZUIDwtIGdncGxvdChpbnBoLmFsbCwgYWVzKE51bWJlci5DRFMsIHRSTkFzLCBmaWxsPXBoYWdlX3R5cGUsIGNvbG91ciA9IHBoYWdlX3R5cGUsIHNoYXBlID0gZl9zcG9yKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpKyAjIEFkZCByZWdyZXNzaW9uIGxpbmUKIHN0YXRfcmVnbGluZV9lcXVhdGlvbihhZXMobGFiZWwgPSBwYXN0ZSguLmVxLmxhYmVsLi4sIC4ucnIubGFiZWwuLiwgc2VwID0gIn5+fn4iKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLngubnBjID0gIm1pZGRsZSIsIGxhYmVsLnkubnBjID0gInRvcCIgKSMgQWRkIGVxdWF0aW9uIysgeWxpbSgwLCAyNSkgIysgeGxpbSgwLCA0MDAwMDApCgpNdlQgPC0gZ2dwbG90KGlucGguYWxsLCBhZXMobW9sR0MuLi4uLCB0Uk5BcywgZmlsbD1waGFnZV90eXBlLCBjb2xvdXIgPSBwaGFnZV90eXBlLCBzaGFwZSA9IGZfc3BvcikpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSsgIyBBZGQgcmVncmVzc2lvbiBsaW5lCiBzdGF0X3JlZ2xpbmVfZXF1YXRpb24oYWVzKGxhYmVsID0gcGFzdGUoLi5lcS5sYWJlbC4uLCAuLnJyLmxhYmVsLi4sIHNlcCA9ICJ+fn5+IikpLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC54Lm5wYyA9ICJtaWRkbGUiLCBsYWJlbC55Lm5wYyA9ICJ0b3AiICkjIEFkZCBlcXVhdGlvbiMrIHlsaW0oMCwgMjUpICMrIHhsaW0oMCwgNDAwMDAwKQoKTXZUICAjIyBub3QgaW50ZXJlc3RpbmcgbG9sCgpndkMgPC0gZ2dwbG90KGlucGguYWxsLCBhZXMoR2Vub21lLkxlbmd0aC4uYnAuLCBOdW1iZXIuQ0RTLCBmaWxsPXBoYWdlX3R5cGUsIGNvbG91ciA9IHBoYWdlX3R5cGUsIHNoYXBlID0gZl9zcG9yKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpKyAjIEFkZCByZWdyZXNzaW9uIGxpbmUKIHN0YXRfcmVnbGluZV9lcXVhdGlvbihhZXMobGFiZWwgPSBwYXN0ZSguLmVxLmxhYmVsLi4sIC4ucnIubGFiZWwuLiwgc2VwID0gIn5+fn4iKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLngubnBjID0gImxlZnQiLCBsYWJlbC55Lm5wYyA9ICJ0b3AiICkjIEFkZCBlcXVhdGlvbiMrIHlsaW0oMCwgMjUpICMrIHhsaW0oMCwgNDAwMDAwKQoKCkd2R0MgPC0gZ2dwbG90KGlucGguYWxsLCBhZXMoR2Vub21lLkxlbmd0aC4uYnAuLCBtb2xHQy4uLi4sIGZpbGw9cGhhZ2VfdHlwZSwgY29sb3VyID0gcGhhZ2VfdHlwZSwgc2hhcGUgPSBmX3Nwb3IpKSArCiAgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKIHN0YXRfcmVnbGluZV9lcXVhdGlvbihhZXMobGFiZWwgPSBwYXN0ZSguLmVxLmxhYmVsLi4sIC4ucnIubGFiZWwuLiwgc2VwID0gIn5+fn4iKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLngubnBjID0gIm1pZGRsZSIsIGxhYmVsLnkubnBjID0gInRvcCIgKQpHdkdDCgphbGwubGluZSA8LSBwbG90X2dyaWQoCiAgZ3ZULCBjdlQsIGd2QywgR3ZHQywgbmNvbD0xKQogIyBsYWJlbHMgPSBjKCdHZW5vbWUgU2l6ZScsICdHQyAlJywgJ1ByZWRpY3RlZCBDRCBSZWdpb25zJywgJ1ByZWRpY3RlZCB0Uk5BcycpLCBuY29sID0gMSkKCmFsbC5saW5lCgpnZ3NhdmUoaGVyZSgiZGF0YS9pbnBoYXJlZF9kYi9pbnBoYXJlZF9saW5lYXIucG5nIiksIGhlaWdodD0xMSwgd2lkdGg9OCkKCgpgYGAKCg==